I am neither especially clever nor especially gifted.I am only very, very curious.

5mouth Archive Project

Stay Hungry · Stay Foolish




IPsec NAT Traversal(NAT-T) - 5mouth

IPsec NAT Traversal(NAT-T)

介绍

本文的大部分内容来自RFC5996 2.23. NAT Traversal1IPsec NAT Transparency2,若存在不准确表述和理解请告知,谢谢。

NAT(PAT)是一种解决IP地址短缺的技术手段,负责将内部地址翻译成公网地址,因为修改了源地址,公网在回复数据包的时候会将数据包发送到NAT网关,网关需要将目的地址翻译成内部地址将数据包路由到正确设备上。

AH封装(AH Encapsulation)

Transport mode and Tunnel mode

    AH Transport
    +--------------------++---------++-------------+
    |Original IPv4 Header||AH Header||Original Data|
    +--------------------++---------++-------------+
    AH Tunnel 
    +-------------------------++---------++--------------------++-------------+
    |New IPv4 Header for IPsec||AH Header||Original IPv4 Header||Original Data|
    +-------------------------++---------++--------------------++-------------+

AH 提供源认证和完整性校验,但是不提供加密服务,所以数据包会计算一个哈希值填写在AH Header中,但是数据包经过NAT 设备之后,会修改报文中的源IP地址,对端收到数据包之后进行反向哈希计算,因为报文被修改而导致哈希值不匹配,所以会导致校验失败而丢弃。

ESP封装(ESP Encapsulation)

Transport mode

    ESP Transport
    +--------------------++----------++-------------++-----------++-------+
    |Original IPv4 Header||ESP Header||Original Data||ESP Trailer||ESP ICV|
    +--------------------++----------++-------------++-----------++-------+

当用户传递数据包是TCP或UDP报文的时候,TCP会强制计算伪头部(Pseudo Header)3 。伪头部计算的内容是,Source Address 、Destination Address 、Reserved 、Protocol、TCP Length。

正常情况下,TCP报文通过NAT设备,转换源地址,NAT设备会重新计算一次伪头部,将重新计算的值填在TCP Checksum 中。但是因为ESP数据包是被加密的,这部分关键数据因为加密而无法获得。因此NAT设备无法获取信息计算校验和,从而导致接收方TCP 校验失败而丢弃包。

说明: Changing the IP addresses in the IP header means the IP header checksum must be calculated. Since both UDP or TCP also have checksums, and these checksums are computed over a pseudo header that contains the IP source and destination address as well, they too must be recalculated each time a translation is made.4

Tunnel mode

    ESP Tunnel
    +-------------------------++----------++--------------------++-------------++-----------++-------+
    |New IPv4 Header for IPsec||ESP Header||Original IPv4 Header||Original Data||ESP Trailer||ESP ICV|
    +-------------------------++----------++--------------------++-------------++-----------++-------+

只有ESP tunnel mode 可以应用在NAT-T的环境中。在通过NAT转换的时候修改的是外部的源IP地址(New IPv4 Header for IPsec),在进行完整性校验的时候校验的也是内部的数据Original IPv4 Header + Original Data 。所以不会修改TCP的校验和,TCP也就能正常通过校验。

ESP 数据包NAT转发

NAT可以大致分为两类,一种是静态一对一的NAT转换,另外一种是多对一转换。在一对一的转换中ESP数据包转发并没有任何问题,但是结合实际情况,使用较多的是多对一转换方式,PAT方式。

PAT是以传输层端口号来进行工作的,但是由于ESP没有传输层端口号,所以ESP在PAT环境中转发的时候就需要使用到NAT-T的方式,来进行工作。

出于这个原因,IPSec将使用UDP封装ESP 数据包。当IPSec 检测到数据包沿途转发中存在NAT设备的时候,IPSec 将采用4500端口重新封装数据包。另外需要注意的是即使IKE初次建立的时候 启动器(initiator)可以直接使用IKE和ESP的端口4500,不管NAT是否存在 。 这种编码效率稍低,但对于NAT设备来说更容易处理。

Original Date       
+--------------------++-------------+       
|Original IPv4 Header||Original Data|
+--------------------++-------------+   

Not Enabled NAT-T       
+-------------------------++----------++--------------------++-------------++-----------++-------+
|New IPv4 Header for IPsec||ESP Header||Original IPv4 Header||Original Data||ESP Trailer||ESP ICV|
+-------------------------++----------++--------------------++-------------++-----------++-------+

Enabled NAT-T       
+-------------------------++----------++----------++--------------------++-------------++-----------++-------+
|New IPv4 Header for IPsec||UDP Header||ESP Header||Original IPv4 Header||Original Data||ESP Trailer||ESP ICV|
+-------------------------++----------++----------++--------------------++-------------++-----------++-------+
                                       ^           ^                                   ^            ^         
                                       |           |                                   |            |         
                                       |           +------------Encrypted -------------+            |               
                                       |                                                            |         
                                       +----------------------Authenticate--------------------------+         

For NAT devices
+-------------------------++----------++----+
|New IPv4 Header for IPsec||UDP Header||Data|
+-------------------------++----------++----+

NAT Traversal实现

配置(关键配置)

拓扑图如下:
 +-----+12.1.1.1          +-----+23.1.1.2          +-----+34.1.1.3          +-----+45.1.1.4          +-----+
 |  R1 |-------F0/0-------|  R2 |-------F0/1-------|  R3 |-------F0/0-------|  R4 |-------F0/1-------|  R5 |
 +-----+          12.1.1.2+-----+          23.1.1.3+-----+          34.1.1.4+-----+          45.1.1.5+-----+

 R1:Server
 R2:Gateway
 R3:Internet
 R4:NAT Device
 R5:Client

由于没能使用IKEv2完成实验,所以如下部分只列举IKEv1 的配置命令。

R1配置:
!
interface FastEthernet0/0
 ip address 12.1.1.1 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 12.1.1.2
R2配置:
!
interface FastEthernet0/0
 ip address 12.1.1.2 255.255.255.0
!         
interface FastEthernet0/1
 ip address 23.1.1.2 255.255.255.0
 crypto map ikev1-map
!
crypto isakmp policy 10
 authentication pre-share
crypto isakmp key ccie43413 address 34.1.1.4       
!
crypto ipsec transform-set ikev1-transform-set esp-des esp-md5-hmac 
 mode tunnel
!
crypto map ikev1-map 10 ipsec-isakmp 
 set peer 34.1.1.4
 set transform-set ikev1-transform-set 
 match address vpn
!
ip access-list extended vpn
 permit ip host 12.1.1.1 host 45.1.1.5
!
ip route 0.0.0.0 0.0.0.0 23.1.1.3
!
R3配置:
!
interface FastEthernet0/0
 ip address 34.1.1.3 255.255.255.0
!
interface FastEthernet0/1
 ip address 23.1.1.3 255.255.255.0
!
R4配置:
!
interface FastEthernet0/0
 no switchport
 ip address 34.1.1.4 255.255.255.0
 ip nat outside
!
interface FastEthernet0/1
 no switchport
 ip address 45.1.1.4 255.255.255.0
 ip nat inside
!
ip nat inside source list 1 interface FastEthernet0/0 overload
ip nat inside source static udp 1.1.1.1 4500 interface FastEthernet0/0 4500
ip nat inside source static udp 1.1.1.1 500 interface FastEthernet0/0 500
!
access-list 1 permit 45.1.1.0 0.0.0.255
!
ip route 0.0.0.0 0.0.0.0 34.1.1.3
!
R5配置:
!
crypto isakmp policy 10
 authentication pre-share
crypto isakmp key ccie43413 address 23.1.1.2       
!
crypto ipsec transform-set ikev1-transform-set esp-des esp-md5-hmac 
 mode tunnel
!
crypto map ikev1-map 10 ipsec-isakmp 
 set peer 23.1.1.2
 set transform-set ikev1-transform-set 
 match address vpn
!
ip access-list extended vpn
 permit ip host 45.1.1.5 host 12.1.1.1
!
interface FastEthernet0/1
 ip address 45.1.1.5 255.255.255.0
 crypto map ikev1-map
!
ip route 0.0.0.0 0.0.0.0 45.1.1.4
!

附录

Frame 12: 174 bytes on wire (1392 bits), 174 bytes captured (1392 bits) on interface 0
Ethernet II, Src: ca:08:15:0c:00:06 (ca:08:15:0c:00:06), Dst: ca:07:1f:8c:00:06 (ca:07:1f:8c:00:06)
Internet Protocol Version 4, Src: 34.1.1.4, Dst: 23.1.1.2
User Datagram Protocol, Src Port: 1025, Dst Port: 4500
    Source Port: 1025
    Destination Port: 4500
    Length: 140
    [Checksum: [missing]]
    [Checksum Status: Not present]
    [Stream index: 1]
UDP Encapsulation of IPsec Packets
Encapsulating Security Payload
    ESP SPI: 0x7fd1fc5d (2144468061)
    ESP Sequence: 2

NAT-T Capturing packets

参考文献


  1. RFC5996 2.23. NAT Traversal
  2. IPsec NAT Transparency
  3. TCP Checksum Calculation and the TCP “Pseudo Header”
  4. IP NAT Compatibility Issues and Special Handling Requirements